package com.bearsadmin.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.bearsadmin.dto.*;
import com.bearsadmin.entity.User;
import com.bearsadmin.vo.UserVO;
import org.springframework.web.multipart.MultipartFile;

/**
 * 用户服务接口
 *
 * @author Bears Admin
 * @since 1.0.0
 */
public interface UserService extends IService<User> {

    /**
     * 用户登录
     *
     * @param loginDTO 登录信息
     * @return JWT token
     */
    String login(LoginDTO loginDTO);

    /**
     * 用户注册
     *
     * @param registerDTO 注册信息
     * @return 用户信息
     */
    UserVO register(RegisterDTO registerDTO);

    /**
     * 根据ID获取用户信息
     *
     * @param id 用户ID
     * @return 用户信息
     */
    UserVO getUserById(Long id);

    /**
     * 更新用户信息
     *
     * @param id            用户ID
     * @param userUpdateDTO 更新信息
     * @return 更新后的用户信息
     */
    UserVO updateUser(Long id, UserUpdateDTO userUpdateDTO);

    /**
     * 根据用户名查询用户
     *
     * @param username 用户名
     * @return 用户信息
     */
    User getUserByUsername(String username);

    /**
     * 上传用户头像
     *
     * @param id   用户ID
     * @param file 头像文件
     * @return 更新后的用户信息
     */
    UserVO uploadAvatar(Long id, MultipartFile file);

    // ================ 用户管理功能 ================

    /**
     * 分页查询用户列表
     *
     * @param queryDTO 查询条件
     * @return 分页用户列表
     */
    IPage<UserVO> pageUsers(UserQueryDTO queryDTO);

    /**
     * 创建用户
     *
     * @param createDTO 用户创建信息
     * @return 创建的用户信息
     */
    UserVO createUser(UserCreateDTO createDTO);

    /**
     * 管理员更新用户信息
     *
     * @param id        用户ID
     * @param manageDTO 更新信息
     * @return 更新后的用户信息
     */
    UserVO manageUser(Long id, UserManageDTO manageDTO);

    /**
     * 删除用户
     *
     * @param id 用户ID
     * @return 删除结果
     */
    boolean deleteUser(Long id);

    /**
     * 批量删除用户
     *
     * @param ids 用户ID列表
     * @return 删除结果
     */
    boolean batchDeleteUsers(java.util.List<Long> ids);

    /**
     * 重置用户密码
     *
     * @param id 用户ID
     * @return 新密码
     */
    String resetPassword(Long id);
}